package com.wuwangfu.utils;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @Description：异步查询
 * @Author：jcshen
 * @Date：2023-07-03
 *
 * 多个线程同时处理任务，有点就是快，缺点是耗费资源（生产环境中计算资源是允许的）
 *
 * 所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。
 * 在 Java 语言中，简单的讲就是另启一个线程来完成调用中的部分计算，使调用继续运行或返回，而不需要等待计算结果。
 * 但调用者仍需要取线程的计算结果。
 *
 * 虽然 Future 以及相关使用方法提供了异步执行任务的能力，但是对于结果的获取却是很不方便，
 * 只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背，
 * 轮询的方式又会耗费无谓的 CPU 资源，而且也不能及时地得到计算结果。
 *
 */
public class ThreadPoolTest {

    public static void main(String[] args) throws Exception {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        Future<String> future = fixedThreadPool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("开始查询");
                Thread.sleep(15000);
                System.out.println("查询结束");
                return "666";
            }
        });

        System.out.println("主线程继续执行");

        System.out.println("是否返回结果：" + future.isDone());

//        String res = future.get(10, TimeUnit.SECONDS);

        String res = future.get();
        System.out.println("返回的结果为：" + res);
    }
}
